<?php
namespace Common\Util;
/**

 * @File name: Loading.php

 * @Author: jiumi.jin

 * @Create time: 10/11/2012

 * @Main function: loading

 */



class LoadingUtils {

    private $width = 500;

    private $total = 0;

    private $start_time;

    private $faileLines = array();

    private $faileCounter = 0;



    /**

     * 构造

     * @param 进度条长度 $width

     * @param 要处理的数据长度 $length

     */

    public function __construct($param){

        ob_start();

        //$this->width = $width;

        $this->total = $param['length'];

        $this->start_time = time();

        ob_end_clean();

    }



    /**

     * 执行进度跟踪

     * @param $num 执行的数据点，这个数字应该是0 到 数据的总长度

     * @return bool

     */

    public function run($num){

        $successNum = $num - $this->faileCounter;

        $percent = number_format($num / $this->total * 100,2) . '%';

        echo "<script>updatePercent('$successNum',$this->faileCounter,'$percent');</script>";

        print str_pad("",100000);

        ob_flush();

        return true;

    }



    /**

     * 占用内存跟踪

     * @param $i 进度

     * @param $progress_mem 占用内存

     * @return bool

     */

    public function run_mem($i,$progress_mem){

        echo "<script>showMem($i,$progress_mem);</script>";

        print str_pad("",100000);

        ob_flush();

        return true;

    }



    /**

     * 设置出错的点

     * 例如导入excel的时候，有不符合模板规范的行数可以在这里设置

     * @param $line 错误行数

     * @param $errMes 错误信息

     */

    public function setFaileLine($line,$errMes){

        $line = intval($line);

        if ($line != 0) {

            $this->faileCounter++;

            $this->faile = true;

            $this->faileLines[$this->faileCounter]['line'] = $line;

            $this->faileLines[$this->faileCounter]['errMessage'] = $errMes;



            echo "<script>showErr('".$this->getFaileLine()."');</script>";

            print str_pad("",100000);

            ob_flush();

            return true;

        }

    }

    public function showErr($msg){
        echo "<script>showErr('".$msg."');</script>";
    }

    public function getFaileCounter(){

        return $this->faileCounter;

    }



    /**

     * 获取出错的点

     *

     * @return string $html

     */

    public function getFaileLine(){

        $html = '';

        if(!empty($this->faileLines)){

            foreach($this->faileLines as $failline){

                $html .= '错误位置：'.$failline['line'].'，  错误信息：'.$failline['errMessage'].'<br/>';

            }

        }else{

            $html .= '没有错误信息';

        }

        return $html;

    }


    public function stop(){
        echo "<script>stop();</script>";
    }
    /**

     * echo出进度条的html页面和js函数

     * 应该在实例化类后立刻执行此方法，否则会失败

     *

     * @return unknown

     */

    public function createHtml(){

        echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/transitional.dtd\">

            <html>

            <head>

                <script>

                    function updatePercent(have_process,errCount,percent){

                       /* document.getElementById('msg').innerHTML = '成功处理了 '+have_process+' 条数据';*/

                        document.getElementById('errMsg').innerHTML = '失败 '+errCount+' 条数据';

                        document.getElementById('progress').style.width = percent;

                        document.getElementById('percent').innerHTML = percent;

                        if(document.getElementById('progress').style.width == '100%'){

                            document.getElementById('percent').innerHTML = '处理完毕！';

                            stop();

                        }

                    }

                    function showErr(msg){

                        document.getElementById('allErr').innerHTML = msg;

                    }

                    //计时

                    var CallTimeLen = \"0\";

                    var timer1 = 1;

                    function start(){

                        var hour=\"0\";

                        var minute=\"0\";

                        var second=\"0\";

                        CallTimeLen = parseInt(CallTimeLen)+1;

                        hour = parseInt(CallTimeLen/3600);

                        minute = parseInt(CallTimeLen/60);

                        second = CallTimeLen%60;

                        document.getElementById('time_h').innerHTML = hour;

                        document.getElementById('time_m').innerHTML = minute;

                        document.getElementById('time_s').innerHTML = second;

                        window.timer1 = window.setTimeout(\"start()\",1000);

                    }

                    setTimeout(\"start()\",0);

                    function stop(){

                     clearTimeout(window.timer1);

                    }



                    function showMem(i,progress){

                        document.getElementById('showM').innerHTML = '_____'+i+': '+progress;

                    }

                </script>

            </head>

            <body>

                <p style=\"margin:0 auto; margin-top:4px; margin-bottom:0; padding: 8px; padding-bottom:0; border: 1px solid gray; background: #EAEAEA; width:".$this->width."px\">

                   <p><font color=\"gray\"><span style=\"font-size:12px;\">此操作需要等待一段时间，在执行完毕之前，请不要关闭此页面</span></font></p>

                   <p style=\"padding: 0; background-color: white; border: 1px solid navy; width:".$this->width."px\">

                       <p id=\"progress\" style=\"padding: 0; background-color: #FFCC66; border: 0; width: 0px; text-align: center;  height: 16px\"></p>

                   </p>

                   <p id=\"msg\" style=\"font-size:12px;\"></p>

                   <p id=\"errMsg\" style=\"font-size:12px;\"></p>

                   已用时：<span id=\"time_h\">  </span>时

                   <span id=\"time_m\">  </span>分

                   <span id=\"time_s\">  </span>秒

                   <p id=\"showM\" style=\"font-size:12px;\"></p>

                   <p id=\"percent\" style=\"position: relative; top: -32px; text-align: center; font-weight: bold; font-size: 8pt;\">0%</p>

                </p>

                <p id=\"allErr\" style=\" color:red; \">

                </p>

            <body>

            </html>";

        return true;

    }

}